#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""检测网页编码

[使用]
1、作为模块导入

import charsetck
charsetck.check(headers,html)

参数说明：
headers：目标URL的http头部信息
html：目标URL的html内容


2、可以直接运行

python charsetck.py http://www.baidu.com 看效果。

[原理]
1、检测http头部是否包含编码
2、上面如果失败，则检测html中的meta是否包含编码
3、上面都失败就使用chardet，但是这里不会拿全部的html去chardet，因为效率会很低，这次会取前几行去判断，提高效率。
"""

import re
import chardet

def check(headers,html):
	charset = ''
	
	if headers and headers.has_key('content-type'):
		ct = headers['content-type'].lower()
		i = ct.find('charset=') 
		if i!=-1: charset=ct[i+len('charset='):]

	if html and not charset:
		co = re.compile(r'''<meta[^<>]+http-equiv[\s="']+Content-Type[^<>]*>''',re.I)
		ct = co.findall(html)
		if ct:
			co = re.compile(r'''charset\s*=\s*([^'"\s<>]+)''',re.I)
			ctt = co.findall(html)
			if ctt:
				charset = ctt[0]
				
	if html and not charset:
		lines = html.split('\n')
		for i in [10,30,100]:
			charset = chardet.detect('\n'.join(lines[:i]))['encoding']
			if charset and charset.lower() != 'ascii':
				break
	
	if charset == None:
		charset = ''
	return charset.lower()

if __name__ == '__main__':
	import urllib2
	import sys
	import socket
	
	socket.setdefaulttimeout(8)
	try:
		url = sys.argv[1]
	except:
		print 'Usage: python charsetck.py {URL}'
		sys.exit(0)
	
	req = urllib2.Request(url)
	req.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
	usock = urllib2.urlopen(req)
	headers = usock.headers.dict
	html = usock.read()
	usock.close()
	
	print check(headers,html)

	
